From 73153b42e8394b105a9b42b6a7605145faeffe12 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 20 Jan 2006 04:35:24 +0000 Subject: [PATCH] Use an unused high bit in the XID to mark fonts in the global xid hash 2006-01-19 Matthias Clasen * gdk/x11/gdkprivate-x11.h (XID_FONT_BIT): * gdk/x11/gdkfont-x11.c: * gdk/x11/gdkxid.c: Use an unused high bit in the XID to mark fonts in the global xid hash table. * gdk/x11/gdkcursor-x11.c (update_cursor): Skip fonts when iterating over the xid hash table, since calling GDK_IS_WINDOW () on an GdkFont can cause a segfault. (#327751, Ryan Lortie) --- gdk/x11/gdkcursor-x11.c | 4 ++++ gdk/x11/gdkfont-x11.c | 4 +++- gdk/x11/gdkprivate-x11.h | 2 ++ gdk/x11/gdkxid.c | 7 ++++++- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/gdk/x11/gdkcursor-x11.c b/gdk/x11/gdkcursor-x11.c index fb4f53b149..f5e8d15ea8 100644 --- a/gdk/x11/gdkcursor-x11.c +++ b/gdk/x11/gdkcursor-x11.c @@ -430,8 +430,12 @@ update_cursor (gpointer key, gpointer value, gpointer data) { + XID *xid = key; GdkCursor *cursor; + if (*xid & XID_FONT_BIT) + return; + if (!GDK_IS_WINDOW (value)) return; diff --git a/gdk/x11/gdkfont-x11.c b/gdk/x11/gdkfont-x11.c index d4c67b401f..4833283ab0 100644 --- a/gdk/x11/gdkfont-x11.c +++ b/gdk/x11/gdkfont-x11.c @@ -50,6 +50,7 @@ struct _GdkFontPrivateX GdkDisplay *display; GSList *names; + XID xid; }; static GHashTable * @@ -214,13 +215,14 @@ gdk_font_load_for_display (GdkDisplay *display, private->xfont = xfont; private->base.ref_count = 1; private->names = NULL; + private->xid = xfont->fid | XID_FONT_BIT; font = (GdkFont*) private; font->type = GDK_FONT_FONT; font->ascent = xfont->ascent; font->descent = xfont->descent; - _gdk_xid_table_insert (display, &xfont->fid, font); + _gdk_xid_table_insert (display, &private->xid, font); } gdk_font_hash_insert (GDK_FONT_FONT, font, font_name); diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index 0bd1868a05..f254deb8fa 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -86,6 +86,8 @@ struct _GdkVisualPrivate GdkScreen *screen; }; +#define XID_FONT_BIT (1<<31) + void _gdk_xid_table_insert (GdkDisplay *display, XID *xid, gpointer data); diff --git a/gdk/x11/gdkxid.c b/gdk/x11/gdkxid.c index b192f8c8b8..f336a20315 100644 --- a/gdk/x11/gdkxid.c +++ b/gdk/x11/gdkxid.c @@ -36,6 +36,11 @@ static gboolean gdk_xid_equal (XID *a, XID *b); +/* The 3 high bits of XIDs are unused. We use one to mark fonts, + * since we must be able to skip fonts when iterating over all XIDs. + */ +#define XID_FONT_BIT (1<<31) + void _gdk_xid_table_insert (GdkDisplay *display, XID *xid, @@ -123,7 +128,7 @@ static gboolean gdk_xid_equal (XID *a, XID *b) { - return (*a == *b); + return ((*a & ~XID_FONT_BIT) == (*b & ~XID_FONT_BIT)); } #define __GDK_XID_C__ -- 2.30.2